/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MAIN;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Anonymous
 */
public class MAIN extends javax.swing.JFrame {

    /**
     * Creates new form Main
     */
        public static int macxcn;//Mã chuyến xe đang chọn
        public static int gh;//Giới hạn vé chuyến xe đang chọn
        public static int chotrong;//Chỗ trống chuyến xe đang chọn
        public static int giatien;//Giá tiền chuyến xe đang chọn
        private MyTableModel model;//Lưu dữ liệu bảng
    public MAIN() {
            try {
                //Kiểm tra Certificate, khởi tạo mã hóa
                GeneratePublicPrivateKeys.Certificate_And_SecretKey();
            } catch (Exception ex) {
                Logger.getLogger(MAIN.class.getName()).log(Level.SEVERE, null, ex);
            }
        //Kết thúc kiểm tra Certificate, khởi tạo mã hóa
        initComponents();
        
        //Khởi tạo giá trị ban đầu
        btnDatVe.setEnabled(false);//Khi mới vào không cho nút đặt vé xử lý sự kiện nhấp chuột
        macxcn=0;
        gh=0;
        chotrong=0;
        giatien=5000;
        new Thread()//code tạo đồng hồ gán vào nút Time
        {
            @Override
            public void run()
            {
             while(true)   
             {
                 Calendar cal=new GregorianCalendar();
                 int hour=cal.get(Calendar.HOUR_OF_DAY);
                 int min=cal.get(Calendar.MINUTE);
                 int sec=cal.get(Calendar.SECOND);
                 int day=cal.get(Calendar.DAY_OF_MONTH);
                 int mon=cal.get(Calendar.MONTH);
                 int year=cal.get(Calendar.YEAR);
                 String time=hour +":"+min+":"+sec+"    "+day+"-"+(mon+1)+"-"+year;
                 btnTime.setLabel(time);
             }
            }
        }.start();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btnDatVe = new java.awt.Button();
        jScrollPane1 = new javax.swing.JScrollPane();
        tbChuyenXe = new javax.swing.JTable();
        btnRefresh = new java.awt.Button();
        btnTime = new java.awt.Button();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("HTBVTQM_CLIENT");

        btnDatVe.setActionCommand("Insert");
        btnDatVe.setLabel("Đặt vé");
        btnDatVe.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnDatVeActionPerformed(evt);
            }
        });

        model = new MyTableModel();
        tbChuyenXe.setAutoCreateRowSorter(true);
        tbChuyenXe.setModel(model);
        ngheBang();
        jScrollPane1.setViewportView(tbChuyenXe);

        btnRefresh.setLabel("Làm mới danh sách");
        btnRefresh.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRefreshActionPerformed(evt);
            }
        });

        btnTime.setLabel("Time");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap(45, Short.MAX_VALUE)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 740, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnTime, javax.swing.GroupLayout.PREFERRED_SIZE, 268, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(btnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, 192, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnDatVe, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(22, 22, 22)
                        .addComponent(btnRefresh, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(btnTime, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnDatVe, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 267, Short.MAX_VALUE))
                .addContainerGap())
        );

        btnDatVe.getAccessibleContext().setAccessibleName("Insert");

        pack();
    }// </editor-fold>//GEN-END:initComponents

    //Sự kiện nhấp chuột vào nút Đặt vé
    private void btnDatVeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnDatVeActionPerformed
        // TODO add your handling code here:
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new GUI.DatVeGUI().setVisible(true);
            }
        });
    }//GEN-LAST:event_btnDatVeActionPerformed

    //Sự kiện nhấp vào nút làm mới danh sách
    private void btnRefreshActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRefreshActionPerformed
        // TODO add your handling code here:
        loadBang();//Tải lại danh sách dữ liệu trong bảng
    }//GEN-LAST:event_btnRefreshActionPerformed
    
    //Hàm load dữ liệu vào bảng
    private boolean loadBang(){
        if(DAO.Connect.tConnect()){//Nếu kết nối với server thành công
            
                model = new MyTableModel();//Thực hiện lấy dữ liệu từ server
                
                tbChuyenXe.setModel(model);//đưa dữ liệu đó vào bảng
                
                ngheBang();//Nghe sự kiện khi nhấp chuột vào từng danh sách trong bảng
                
                btnDatVe.setEnabled(false);//hủy kích hoạt nút đặt vé khi làm mới danh sách
                return true;
           }
        else{

        }
        return false;
    }
    
    //Hàm nghe sự kiện trong bảng dữ liệu
    private void ngheBang(){
        
        tbChuyenXe.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
        
        tbChuyenXe.getSelectionModel().addListSelectionListener(
                new ListSelectionListener() {
                    @Override
                    public void valueChanged(ListSelectionEvent event) {
    
                        int viewRow = tbChuyenXe.getSelectedRow();
                        if (viewRow < 0) {//Nếu chưa chọn dòng nào
                            //Selection got filtered away.
                            btnDatVe.setEnabled(false);//hủy kích hoạt nút đặt vé
                            
                        } else {//Nếu chọn 1 dòng trong danh sách
                            
                            //Nếu còn có thể đặt vé
                            if(!"FULL".equals(String.valueOf(tbChuyenXe.getValueAt(viewRow, 6)))) {
                                
                                btnDatVe.setEnabled(true);//Kích hoạt nút
                                
                                //lưu các giá trị cần thiết chuyến xe để chuẩn bị chuyển sang màn hình đặt vé
                                macxcn=Integer.parseInt(String.valueOf(tbChuyenXe.getValueAt(viewRow, 0)));
                                gh=Integer.parseInt(String.valueOf(tbChuyenXe.getValueAt(viewRow, 5)));
                                giatien=Integer.parseInt(String.valueOf(tbChuyenXe.getValueAt(viewRow, 6)));
                                int vdd=Integer.parseInt(String.valueOf(tbChuyenXe.getValueAt(viewRow, 7)));
                                int sl=Integer.parseInt(String.valueOf(tbChuyenXe.getValueAt(viewRow, 4)));
                                chotrong=sl-vdd;
                            }
                            else
                                btnDatVe.setEnabled(false);
                        }
                    }
                }
        );
    }
    
    //Đối tượng lưu dữ liệu cho bảng
    class MyTableModel extends AbstractTableModel {
        private String[] columnNames={"MaCX",
                                        "GaBatDau",
                                        "GaKetThuc","ThoiGianChay","SLVe","GHVe","GiaTien","VeDaDat"};; 
        public Object[][] data;
        public MyTableModel(){
            int cot=0;
            int dong=0;
            if(DAO.Connect.tConnect()){//Nếu kết nối với server thành công
                try
                {  
                    //Lấy dữ liệu từ server về
                    BUS.ChuyenXeBUS cxbus=new BUS.ChuyenXeBUS();
                    List<DTO.ChuyenXeDTO> Lcxdto= new ArrayList<DTO.ChuyenXeDTO>();//Biến lưu danh sách chuyến xe
                    Lcxdto=cxbus.dsChuyenXe();//hàm phụ trách lấy dữ liệu server về
                        
                    //Thực hiện đưa dữ liệu vào bảng
                    data=new Object[Lcxdto.size()][8];
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd-MM-yyyy");
                   for(int i=0;i<Lcxdto.size();i++)
                    {              
                        data[dong][cot++]=Lcxdto.get(i).getMaChuyen();
                        data[dong][cot++]=Lcxdto.get(i).getGaBatDau();
                        data[dong][cot++]=Lcxdto.get(i).getGaKetThuc();
                        data[dong][cot++]=simpleDateFormat.format(Lcxdto.get(i).getThoiGianChay());
                        data[dong][cot++]=Lcxdto.get(i).getSoLuongVe();                 
                        data[dong][cot++]=Lcxdto.get(i).getGioiHanVe();
                        data[dong][cot++]=Lcxdto.get(i).getGiaTien();
                        if(Lcxdto.get(i).getVeDaDat()==Lcxdto.get(i).getSoLuongVe())
                            data[dong][cot++]="FULL";
                        else
                            data[dong][cot++]=Lcxdto.get(i).getVeDaDat();
                        
                        cot=0;
                        dong++;
                    }
                }
                catch (Exception ex)
                {
                    data=new Object[0][8];
                    System.out.println(ex.getMessage());
                }      
            }
            else
            {
                data=new Object[0][8];
            }
        }
        @Override
        public int getColumnCount() {
            return columnNames.length;
        }

        @Override
        public int getRowCount() {
            return data.length;
        }

        @Override
        public String getColumnName(int col) {
            return columnNames[col];
        }

        @Override
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        /*
         * JTable uses this method to determine the default renderer/
         * editor for each cell.  If we didn't implement this method,
         * then the last column would contain text ("true"/"false"),
         * rather than a check box.
         */
        @Override
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        /*
         * Don't need to implement this method unless your table's
         * editable.
         */
        @Override
        public boolean isCellEditable(int row, int col) {
            //Note that the data/cell address is constant,
            //no matter where the cell appears onscreen.
            //if (col < 2) {
                return false;
            //} else {
            //    return true;
            //}
        }

        /*
         * Don't need to implement this method unless your table's
         * data can change.
         */
        @Override
           public void setValueAt(Object value, int row, int col) {
            if (true) {
                System.out.println("Setting value at " + row + "," + col
                                   + " to " + value
                                   + " (an instance of "
                                   + value.getClass() + ")");
            }

            data[row][col] = value;
            fireTableCellUpdated(row, col);

            if (true) {
                System.out.println("New value of data:");
                printDebugData();
            }
        }

        private void printDebugData() {
            int numRows = getRowCount();
            int numCols = getColumnCount();

            for (int i=0; i < numRows; i++) {
                System.out.print("    row " + i + ":");
                for (int j=0; j < numCols; j++) {
                    System.out.print("  " + data[i][j]);
                }
                System.out.println();
            }
            System.out.println("--------------------------");
        }
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (    ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MAIN.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                if(!DAO.Connect.tConnect()){//Nếu kết nối server thất bại
                            //kích hoạt màn hình cấu hình server  mặc định là 127.0.0.1 port 1234
                            new GUI.ConfigGUI().setVisible(true);
                            }
                            else{
                    //Ngược lại kích hoạt màn hình chính
                                new MAIN().setVisible(true);
                            }
                
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private java.awt.Button btnDatVe;
    private java.awt.Button btnRefresh;
    private java.awt.Button btnTime;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tbChuyenXe;
    // End of variables declaration//GEN-END:variables
}
